package ViewsTUI;

import Controllers.*;
import Models.*;
import byggemarked.Console;
import java.util.ArrayList;

/**
 * @author Morten
 */
public class CustomerView
{
    private CustomerCTR controller;

    public CustomerView()
    {
	this.controller = new CustomerCTR();
	ArrayList<String> options = new ArrayList<String>();
	options.add("Tilføj privatkunde");
	options.add("Tilføj erhvervskunde");
	options.add("Find kunde");
	options.add("Hent kunde");
	options.add("Redigér kunde");
	options.add("Slet kunde");

	boolean isTimeToQuit = false;
	while(!isTimeToQuit)
	{
	    Console.printMenu(true, "Kunder", options);
	    int choice = Console.readChoice(0, 5);
	    switch(choice)
	    {
		case 1: addPrivateCustomer();	break;
		case 2: addBusinessCustomer();	break;
		case 3: findCustomer();			break;
		case 4: getCustomer();			break;
		case 5: editCustomer();			break;
		case 6: removeCustomer();		break;
		case 0: isTimeToQuit = true;
	    }
	}
    }

    private void addPrivateCustomer()
    {
	Console.print("Indtast navn:");
	String name = Console.readString();

	Console.print("Indtast adresse:");
	String address = Console.readString();

	Console.print("Indtast post nummer:");
	int zipCode = Console.readInt();

	Console.print("Indtast by:");
	String city = Console.readString();

	Console.print("Indtast telefonnummer:");
	int phoneNo = Console.readInt();

	this.controller.addPrivateCustomer(name, address, zipCode, city, phoneNo);
    }

    private void addBusinessCustomer()
    {
	Console.print("Indtast firmanavn:");
	String companyName = Console.readString();

	Console.print("Indtast navn på kontaktperson:");
	String contact = Console.readString();

	Console.print("Indtast CVR-nummer:");
	int cvr = Console.readInt();

	Console.print("Indtast adresse:");
	String address = Console.readString();

	Console.print("Indtast post nummer:");
	int zipCode = Console.readInt();

	Console.print("Indtast by:");
	String city = Console.readString();

	Console.print("Indtast telefonnummer:");
	int phoneNo = Console.readInt();

        this.controller.addBusinessCustomer(companyName, contact, cvr, address, zipCode, city, phoneNo);
    }

    private void findCustomer(boolean standAlone)
    {
	Console.print("For at søge efter en kunde skal du indtaste mindst et af søgekriterierne.");
	Console.print("Indtast navn eller firmanavn:");
	String companyName = Console.readString(true);

	Console.print("Indtast navn på kontaktperson (kun firma):");
	String contact = Console.readString(true);

	Console.print("Indtast CVR-nummer (kun firma):");
	int cvr = Console.readInt(true);

	Console.print("Indtast adresse:");
	String address = Console.readString(true);

	Console.print("Indtast post nummer:");
	int zipCode = Console.readInt(true);

	Console.print("Indtast by:");
	String city = Console.readString(true);

	Console.print("Indtast telefonnummer:");
	int phoneNo = Console.readInt(true);

	ArrayList<Customer> customers = this.controller.findCustomer(address, zipCode, city, phoneNo, companyName, contact, cvr);
        if(customers.size() > 0)
	{
	    this.showList(customers);
	    if(standAlone)
	    {
		Console.print("Indtast den ønskede kundes ID, som står ude til venstre i listen.");
		int id = Console.readInt();
		Customer customer = this.controller.getCustomer(id);
		if(customer != null)
		{
		    this.showInfo(customer);
		}
		else
		{
		    Console.print("Der kunne ikke findes nogen kunde med det valgte ID.");
		}
	    }
	}
	else
	{
	    Console.print("Der fandtes ingen kunder med de indtastede søgekriterier.");
	}
    }

    private void findCustomer()
    {
	this.findCustomer(true);
    }

    private void getCustomer()
    {
	Console.print("Indtast kundens ID eller skan kundekortet.");
	int customerInt = Console.readInt();
	Customer customer = this.controller.getCustomer(customerInt);
	if(customer != null)
	{
	    showInfo(customer);
	}
	else
	{
	    Console.print("Der kunne ikke findes nogen kunde med det valgte ID.");
	}
    }

    private void editCustomer()
    {
	Console.print("For at redigere en kunde, skal den først findes.");
	Customer customer = null;
	boolean hasValidCustomer = false;
	while(!hasValidCustomer)
	{
	    try
	    {
		customer = searchProcedure();
		if(customer != null)
		{
		    hasValidCustomer = true;
		}
		else
		{
		    return;
		}
	    }
	    catch(Exception e)
	    { }
	}
	Console.print("Du får nu muligheden for at redigere de enkelte felter seperat. Hvis et felt ikke ønskes ændret, springes feltet over med ENTER. Den nuværende værdi i feltet vises i parantes i linien ovenover.");
	if(customer instanceof PrivateCustomer)
	{
	    PrivateCustomer pCustomer = (PrivateCustomer)customer;

	    Console.print("Indtast navn ("+pCustomer.getName()+"):");
	    String name = Console.readString(true);
	    if(!name.equals("")) { pCustomer.setName(name); }
	}
	else if(customer instanceof BusinessCustomer)
	{
	    BusinessCustomer bCustomer = (BusinessCustomer)customer;
			
	    Console.print("Indtast firmanavn ("+bCustomer.getCompanyName()+"):");
	    String companyName = Console.readString(true);
	    if(!companyName.equals("")) { bCustomer.setCompanyName(companyName); }

	    Console.print("Indtast navn på kontaktperson ("+bCustomer.getContact()+"):");
	    String contact = Console.readString(true);
	    if(!contact.equals("")) { bCustomer.setContact(contact); }

	    Console.print("Indtast CVR-nummer ("+bCustomer.getCvr()+"):");
	    int cvr = Console.readInt(true);
	    if(cvr != 0) { bCustomer.setCvr(cvr); }
	}

	Console.print("Indtast adresse ("+customer.getAddress()+"):");
	String address = Console.readString(true);
	if(!address.equals("")) { customer.setAddress(address); }

	Console.print("Indtast post nummer ("+customer.getZipCode()+"):");
	int zipCode = Console.readInt(true);
	if(zipCode != 0) { customer.setZipCode(zipCode); }

	Console.print("Indtast by ("+customer.getCity()+"):");
	String city = Console.readString(true);
	if(!city.equals("")) { customer.setCity(city); }

	Console.print("Indtast telefonnummer ("+customer.getPhoneNo()+"):");
	int phoneNo = Console.readInt(true);
	if(phoneNo != 0) { customer.setPhoneNo(phoneNo); }
    }

    private void removeCustomer()
    {
	Console.print("For at slette en kunde, skal den først findes.");
	Customer customer = null;
	boolean hasValidCustomer = false;
	while(!hasValidCustomer)
	{
	    try
	    {
		customer = searchProcedure();
		if(customer != null)
		{
		    hasValidCustomer = true;
		}
		else
		{
		    return;
		}
	    }
	    catch(Exception e)
	    { }
	}
	String name = null;
	if(customer instanceof PrivateCustomer)
	{
	    PrivateCustomer pCustomer = (PrivateCustomer)customer;
	    name = pCustomer.getName();
	}
	else if(customer instanceof BusinessCustomer)
	{
	    BusinessCustomer bCustomer = (BusinessCustomer)customer;
	    name = bCustomer.getCompanyName();
	}
	this.controller.removeCustomer(customer);
	Console.print(name+" er nu slettet fra kundedatabasen.");
    }

    private Customer searchProcedure() throws Exception
    {
	Console.print("Hvordan vil du finde kunden?");
	ArrayList<String> options = new ArrayList<String>();
	options.add("ID");
	options.add("Søgning");
	options.add("Liste");
	Console.printMenu(false, null, options);

	int choice = Console.readChoice(0, 3);
	int id = 0;
	boolean doSomething = true;
	switch(choice)
	{
	    case 1:
		Console.print("Indtast kundens ID eller skan kundekortet.");
		id = Console.readInt();
		break;
	    case 2:
		Console.print("Indtast den ønskede kundes ID, som står ude til venstre i listen af søgeresultater.");
		this.findCustomer(false);
		id = Console.readInt();
		break;
	    case 3:
		Console.print("Indtast den ønskede kundes ID, som står ude til venstre i listen.");
		this.showList(this.controller.getAllCustomers());
		id = Console.readInt();
		break;
	    case 0:
		doSomething = false;
		break;
	}
	if(doSomething)
	{
	    Customer customer = this.controller.getCustomer(id);
	    if(customer != null)
	    {
		return customer;
	    }
	    else
	    {
		Console.print("Der kunne ikke findes nogen kunde med det valgte ID.");
		throw new Exception();
	    }
	}
	else
	{
	    return null;
	}
    }

    private int showList(ArrayList<Customer> customers)
    {
	int i = 0;
	for (Customer customer : customers)
	{
	    i++;
	    if(customer instanceof PrivateCustomer)
	    {
		PrivateCustomer pCustomer = (PrivateCustomer)customer;
		Console.print("{"+pCustomer.getId()+"}: (P) "+pCustomer.getName()+"\t"+pCustomer.getPhoneNo());
	    }
	    else if(customer instanceof BusinessCustomer)
	    {
		BusinessCustomer bCustomer = (BusinessCustomer)customer;
		Console.print("{"+bCustomer.getId()+"}: (E) "+bCustomer.getCompanyName()+"\t"+bCustomer.getCvr());
	    }
	}
	return i;
    }

    private void showInfo(Customer customer)
    {
	if(customer instanceof PrivateCustomer)
	{
	    PrivateCustomer pCustomer = (PrivateCustomer)customer;
	    Console.print("- Privatkunde -");
	    Console.print("ID: "+pCustomer.getId()+",\tNavn: "+pCustomer.getName());
	}
	else if(customer instanceof BusinessCustomer)
	{
	    BusinessCustomer bCustomer = (BusinessCustomer)customer;
	    Console.print("- Erhvervskunde -");
	    Console.print("ID: "+bCustomer.getId()+",\tNavn:"+bCustomer.getCompanyName());
	    Console.print("Kontaktperson: "+bCustomer.getContact());
	    Console.print("CVR nr.: "+bCustomer.getCvr());
	}

	Console.print("Adresse: "+customer.getAddress());
	Console.print("Post nr./By: "+customer.getZipCode()+" "+customer.getCity());
	Console.print("Telefonnummer: "+customer.getPhoneNo());
    }
}